<?php
/*
 * @ https://EasyToYou.eu - IonCube v11 Decoder Online
 * @ PHP 7.2 & 7.3
 * @ Decoder version: 1.1.6
 * @ Release: 10/08/2022
 */

// Decoded file for php version 71.
defined("IDENTIFIER_OLE") or defined("IDENTIFIER_OLE") || define("IDENTIFIER_OLE", pack("CCCCCCCC", 208, 207, 17, 224, 161, 177, 26, 225));
class PHPExcel_Shared_OLERead
{
    private $data = "";
    public $wrkbook;
    public $summaryInformation;
    public $documentSummaryInformation;
    const IDENTIFIER_OLE = IDENTIFIER_OLE;
    const BIG_BLOCK_SIZE = 512;
    const SMALL_BLOCK_SIZE = 64;
    const PROPERTY_STORAGE_BLOCK_SIZE = 128;
    const SMALL_BLOCK_THRESHOLD = 4096;
    const NUM_BIG_BLOCK_DEPOT_BLOCKS_POS = 44;
    const ROOT_START_BLOCK_POS = 48;
    const SMALL_BLOCK_DEPOT_BLOCK_POS = 60;
    const EXTENSION_BLOCK_POS = 68;
    const NUM_EXTENSION_BLOCK_POS = 72;
    const BIG_BLOCK_DEPOT_BLOCKS_POS = 76;
    const SIZE_OF_NAME_POS = 64;
    const TYPE_POS = 66;
    const START_BLOCK_POS = 116;
    const SIZE_POS = 120;
    public function read($sFileName)
    {
        if(!is_readable($sFileName)) {
            throw new PHPExcel_Reader_Exception("Could not open " . $sFileName . " for reading! File does not exist, or it is not readable.");
        }
        $this->data = file_get_contents($sFileName, false, NULL, 0, 8);
        if($this->data != self::IDENTIFIER_OLE) {
            throw new PHPExcel_Reader_Exception("The filename " . $sFileName . " is not recognised as an OLE file");
        }
        $this->data = file_get_contents($sFileName);
        $this->numBigBlockDepotBlocks = self::getInt4d($this->data, 44);
        $this->rootStartBlock = self::getInt4d($this->data, 48);
        $this->sbdStartBlock = self::getInt4d($this->data, 60);
        $this->extensionBlock = self::getInt4d($this->data, 68);
        $this->numExtensionBlocks = self::getInt4d($this->data, 72);
        $bigBlockDepotBlocks = [];
        $pos = 76;
        $bbdBlocks = $this->numBigBlockDepotBlocks;
        if($this->numExtensionBlocks != 0) {
            $bbdBlocks = 109;
        }
        for ($i = 0; $i < $bbdBlocks; $i++) {
            $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos);
            $pos += 4;
        }
        for ($j = 0; $j < $this->numExtensionBlocks; $j++) {
            $pos = ($this->extensionBlock + 1) * 512;
            $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, 127);
            for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; $i++) {
                $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos);
                $pos += 4;
            }
            $bbdBlocks += $blocksToRead;
            if($bbdBlocks < $this->numBigBlockDepotBlocks) {
                $this->extensionBlock = self::getInt4d($this->data, $pos);
            }
        }
        $pos = 0;
        $this->bigBlockChain = "";
        $bbs = 128;
        for ($i = 0; $i < $this->numBigBlockDepotBlocks; $i++) {
            $pos = ($bigBlockDepotBlocks[$i] + 1) * 512;
            $this->bigBlockChain .= substr($this->data, $pos, 4 * $bbs);
            $pos += 4 * $bbs;
        }
        $pos = 0;
        $sbdBlock = $this->sbdStartBlock;
        $this->smallBlockChain = "";
        while ($sbdBlock != -2) {
            $pos = ($sbdBlock + 1) * 512;
            $this->smallBlockChain .= substr($this->data, $pos, 4 * $bbs);
            $pos += 4 * $bbs;
            $sbdBlock = self::getInt4d($this->bigBlockChain, $sbdBlock * 4);
        }
        $block = $this->rootStartBlock;
        $this->entry = $this->_readData($block);
        $this->readPropertySets();
    }
    public function getStream($stream)
    {
        if($stream === NULL) {
            return NULL;
        }
        $streamData = "";
        if($this->props[$stream]["size"] < 4096) {
            $rootdata = $this->_readData($this->props[$this->rootentry]["startBlock"]);
            $block = $this->props[$stream]["startBlock"];
            while ($block != -2) {
                $pos = $block * 64;
                $streamData .= substr($rootdata, $pos, 64);
                $block = self::getInt4d($this->smallBlockChain, $block * 4);
            }
            return $streamData;
        }
        $numBlocks = $this->props[$stream]["size"] / 512;
        if($this->props[$stream]["size"] % 512 != 0) {
            $numBlocks++;
        }
        if($numBlocks == 0) {
            return "";
        }
        $block = $this->props[$stream]["startBlock"];
        while ($block != -2) {
            $pos = ($block + 1) * 512;
            $streamData .= substr($this->data, $pos, 512);
            $block = self::getInt4d($this->bigBlockChain, $block * 4);
        }
        return $streamData;
    }
    private function _readData($bl)
    {
        $block = $bl;
        $data = "";
        while ($block != -2) {
            $pos = ($block + 1) * 512;
            $data .= substr($this->data, $pos, 512);
            $block = self::getInt4d($this->bigBlockChain, $block * 4);
        }
        return $data;
    }
    private function readPropertySets()
    {
        $offset = 0;
        $entryLen = strlen($this->entry);
        while ($offset < $entryLen) {
            $d = substr($this->entry, $offset, 128);
            $nameSize = ord($d[64]) | ord($d[65]) << 8;
            $type = ord($d[66]);
            $startBlock = self::getInt4d($d, 116);
            $size = self::getInt4d($d, 120);
            $name = str_replace("\0", "", substr($d, 0, $nameSize));
            $this->props[] = ["name" => $name, "type" => $type, "startBlock" => $startBlock, "size" => $size];
            $upName = strtoupper($name);
            if($upName === "WORKBOOK" || $upName === "BOOK") {
                $this->wrkbook = count($this->props) - 1;
            } elseif($upName === "ROOT ENTRY" || $upName === "R") {
                $this->rootentry = count($this->props) - 1;
            }
            if($name == chr(5) . "SummaryInformation") {
                $this->summaryInformation = count($this->props) - 1;
            }
            if($name == chr(5) . "DocumentSummaryInformation") {
                $this->documentSummaryInformation = count($this->props) - 1;
            }
            $offset += 128;
        }
    }
    private static function getInt4d($data, $pos)
    {
        $_or_24 = ord($data[$pos + 3]);
        if(128 <= $_or_24) {
            $_ord_24 = -1 * abs(256 - $_or_24 << 24);
        } else {
            $_ord_24 = ($_or_24 & 127) << 24;
        }
        return ord($data[$pos]) | ord($data[$pos + 1]) << 8 | ord($data[$pos + 2]) << 16 | $_ord_24;
    }
}

?>